package com.adam.test.service;

import org.springframework.transaction.annotation.Propagation;

/**
 * 传播行为测试-添加接口
 * @param <E> 实体类型
 *
 * @author jiangwh
 */
public interface IPropagationAddService<E> {

    /**
     * 清空表
     */
    void truncate();

    /**
     * 不使用事务
     *
     * @param bean
     */
    void add(E bean);

    /**
     * 不使用事务，抛出异常
     *
     * @param bean
     */
    void addThrow(E bean);

    /**
     * 如果当前没有事务，就新建一个事务；如果当前存在事务，就加入到这个事务中
     * <ul>
     *     <li>传播行为：{@link Propagation#REQUIRED}</li>
     * </ul>
     *
     * @param bean
     */
    void addRequired(E bean);

    /**
     * 如果当前没有事务，就新建一个事务；如果当前存在事务，就加入到这个事务中
     * <ul>
     *     <li>传播行为：{@link Propagation#REQUIRED}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addRequiredThrow(E bean);

    /**
     * 如果当前没有事务，就新建一个事务；如果当前存在事务，则挂起当前事务，新建一个事务
     * <ul>
     *     <li>传播行为：{@link Propagation#REQUIRES_NEW}</li>
     * </ul>
     *
     * @param bean
     */
    void addRequiresNew(E bean);

    /**
     * 如果当前没有事务，就新建一个事务；如果当前存在事务，则挂起当前事务，新建一个事务
     * <ul>
     *     <li>传播行为：{@link Propagation#REQUIRES_NEW}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addRequiresNewThrow(E bean);

    /**
     * 如果当前没有事务，就新建一个事务；如果当前存在事务，则作为当前事务的子事务执行
     * <ul>
     *     <li>传播行为：{@link Propagation#NESTED}</li>
     * </ul>
     *
     * @param bean
     */
    void addNested(E bean);

    /**
     * 如果当前没有事务，就新建一个事务；如果当前存在事务，则作为当前事务的子事务执行
     * <ul>
     *     <li>传播行为：{@link Propagation#NESTED}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addNestedThrow(E bean);

    /**
     * 如果当前没有事务，就以非事务方式执行；如果当前存在事务，则加入到这个事务中
     * <ul>
     *     <li>传播行为：{@link Propagation#SUPPORTS}</li>
     * </ul>
     *
     * @param bean
     */
    void addSupports(E bean);

    /**
     * 如果当前没有事务，就以非事务方式执行；如果当前存在事务，则加入到这个事务中
     * <ul>
     *     <li>传播行为：{@link Propagation#SUPPORTS}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addSupportsThrow(E bean);

    /**
     * 如果当前没有事务，就抛出异常；如果当前存在事务，则加入到这个事务中
     * <ul>
     *     <li>传播行为：{@link Propagation#MANDATORY}</li>
     * </ul>
     *
     * @param bean
     */
    void addMandatory(E bean);

    /**
     * 如果当前没有事务，就抛出异常；如果当前存在事务，则加入到这个事务中
     * <ul>
     *     <li>传播行为：{@link Propagation#MANDATORY}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addMandatoryThrow(E bean);

    /**
     * 以非事务方式执行；如果当前存在事务，则挂起当前事务
     * <ul>
     *     <li>传播行为：{@link Propagation#NOT_SUPPORTED}</li>
     * </ul>
     *
     * @param bean
     */
    void addNotSupported(E bean);

    /**
     * 以非事务方式执行；如果当前存在事务，则挂起当前事务
     * <ul>
     *     <li>传播行为：{@link Propagation#NOT_SUPPORTED}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addNotSupportedThrow(E bean);

    /**
     * 以非事务方式执行；如果当前存在事务，则抛出异常
     * <ul>
     *     <li>传播行为：{@link Propagation#NEVER}</li>
     * </ul>
     *
     * @param bean
     */
    void addNever(E bean);

    /**
     * 以非事务方式执行；如果当前存在事务，则抛出异常
     * <ul>
     *     <li>传播行为：{@link Propagation#NEVER}</li>
     * </ul>
     *
     * @param bean
     * @throws IllegalStateException
     */
    void addNeverThrow(E bean);

}
